import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.*;
/**
 * En la clase arquero se crean las flechas y se va checando el nivel.
 * 
 * @author Gabriel
 * @version 1.0
 */
public class Arquero extends Actor
{
    /**
     * sirve para crear el vector de la flecha.
     */
    public Fuerza fuerza;  
    /**
     * Sirve para checar en que nivel se encuentra el jugador.
     */
    public int nivel ;   
     /**
     * En el metodo act de esta clase se inicia la verificacion del mouse.
     */
    public void act() 
    {
        checkClick();
    }
    
    /**
     * En este metodo se checa si el mouse fue presionado y arrastrado.
     * Si este lo fue, se verifica la posicion inicial y final del arrastre y se crea el vector.
     */
    private void checkClick()
    {
        World mundo = getWorld();
        List<Nivel> stage = getWorld().getObjects(Nivel.class);
        nivel= stage.get(0).getNivel();
        if(Greenfoot.mouseDragged(null)) {    //checa arrastre del mouse.
            MouseInfo mouse = Greenfoot.getMouseInfo();
            int dx = mouse.getX()-getX();     //posiciones del vector
            int dy = mouse.getY()-getY();
            if (fuerza == null) {
                fuerza = new Fuerza(dx, dy);
                getWorld().addObject( fuerza, getX(), getY() );
            }
            else {
                fuerza.setImage(dx, dy);
            }
        }
        if(Greenfoot.mouseDragEnded(null) && fuerza != null) {    //checa arrastre del mouse.
            getWorld().removeObject(fuerza);
            fuerza = null;
            MouseInfo mouse = Greenfoot.getMouseInfo();
            Vector force = new Vector(new Lugar(mouse.getX(), mouse.getY()), new Lugar(getX(), getY()));    //crea el vector.
            force.escala(0.3);
            switch(nivel)     //aqui se checa la flecha que debe de existir para cada nivel.
            {
                case 1: Fmadera madera = new Fmadera(force);
                        mundo.addObject(madera, getX(), getY());
                        break;
                case 2: Fmetal metal = new Fmetal(force);
                        mundo.addObject(metal, getX(), getY());
                        break;
                case 3: Fmadera made = new Fmadera(force);
                        mundo.addObject(made, getX(), getY());
                        break;
                case 4: Fmetal metal1 = new Fmetal(force);
                        mundo.addObject(metal1, getX(), getY());
                        break; 
                case 5: Fmetal metal2 = new Fmetal(force);
                        mundo.addObject(metal2, getX(), getY());
                        break;
                default:Flecha arrow = new Flecha(force);
                        mundo.addObject(arrow, getX(), getY());
                
            }
            
            Greenfoot.playSound("arrow.wav");            
            List<Flechas> numFlechas = getWorld().getObjects(Flechas.class);   //verifica las flechas en el mundo
            
            if(numFlechas.get(0).getNum() <= 0)     //si el numero de flechas llega a cero.
            {
                List<Nivel> numSet = getWorld().getObjects(Nivel.class);
                List<Flecha> flechas = getWorld().getObjects(Flecha.class);
                for(Flecha f : flechas)
                {
                    getWorld().removeObject(f);    //remueve la fuerza
                }
                
                if(numSet.get(0).getNivel()<6)    //niveles del juego
                {
                    numSet.get(0).aumentaNivel();     //se envia el aumentoal marcador
                    mundo.addObject(new CambiaNivel(numSet.get(0).getNivel()),400,300);     //se cambia el nivel.
                    numFlechas.get(0).reinicio();     // se reinicial las flechas en cada nivel
                }
                else
                {
                    mundo.addObject(new CambiaNivel(7),0,0);    // se forza el final del juego
                }
            }
            else
            {
                numFlechas.get(0).dec();     // se decrementa el numero de flechas.
            }
            
        }
    }    
}
